Easy
Given an array arr
and a function fn
, return a sorted array sortedArr
. You can assume fn
only returns numbers and those numbers determine the sort order of sortedArr
. sortedArray
must be sorted in ascending order by fn
output.
You may assume that fn
will never duplicate numbers for a given array.
給定一個陣列arr
和一個函數fn
作為參數,回傳一個排序陣列sortedArr
。
可以假設fn
僅傳回數字,並且這些數字決定sortedArr
的排序順序。
sortedArray
必須按 fn
輸出 "升序排序"。
Input: arr = [5, 4, 1, 2, 3], fn = (x) => x
Output: [1, 2, 3, 4, 5]
可假設fn
永遠不會重複給定數組的數字。
根據函數 fn 的返回值對數組 arr 進行升序排序,並返回排序後的新數組。
const sortBy =function(arr, fn) {
//排序的邏輯
return arr.slice().sort((a, b) => fn(a) - fn(b));
}
arr.slice()
沒有傳遞任何參數時,將返回原始數組 arr 的淺拷貝(shallow copy),這是一種常用於復制數組的方法。
這意味著它會創建一個新數組,包含原數組中的所有元素,並將這些元素複製到新數組中,但不會影響原始數組。
.sort((a, b) => fn(a) - fn(b))
陣列的 sort 方法,該方法接受一個比較函數作為參數。
計算了fn(a) - fn(b)這兩個返回值的差值,這將成為排序的依據。
=> 如果差值為負數,則 a 應該排在 b 前面,
如果差值為正數,則 b 應該排在 a 前面,
如果差值為零,則它們保持相對順序不變。 最後,函數返回了排序後的新數組。
=> 範例
const fruits = ['apple', 'banana', 'cherry', 'date'];
fruits.sort();
// 陣列现在按字母顺序排序:['apple', 'banana', 'cherry', 'date']
const numbers = [5, 2, 9, 1, 5];
numbers.sort((a, b) => a - b);
// numbers 数组现在升序排序:[1, 2, 5, 5, 9]
numbers.sort((a, b) => b - a);
// numbers 数组现在降序排序:[9, 5, 5, 2, 1]
let arr = [5, 4, 1, 2, 3] ;
let fn = (x) => x;
let result = sortBy(arr,fn);
console.log(JSON.stringify(result));
//輸出[1, 2, 3, 4, 5]
arr = [{"x": 1}, {"x": 0}, {"x": -1}];
fn = (d) => d.x;
result = sortBy(arr,fn);
console.log(JSON.stringify(result));
//輸出[{"x":-1},{"x":0},{"x":1}]
arr = [[3, 4], [5, 2], [10, 1]];
fn = (x) => x[1];
result = sortBy(arr,fn);
console.log(JSON.stringify(result));
//輸出 [[10,1],[5,2],[3,4]]